<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script>
	// - 方式一: Object构造函数模式
	// - 套路: 先创建空Object对象, 再动态添加属性/方法
	// - 适用场景: 起始时不确定对象内部数据
	// - 问题: 语句太多
	// {
	// 	const obj = new Object({
	// 		c:100
	// 	});
	// 	obj.a = 1;
	// 	obj.b = 2;
	// 	console.log(obj);
	// }
	
	
	// * 方式二: 对象字面量模式
	// * 套路: 使用{}创建对象, 同时指定属性/方法
	// * 适用场景: 起始时对象内部数据是确定的
	// * 问题: 如果创建多个同结构的对象, 有重复代码
	// {
	// 	const obj = {
	// 		a:1,
	// 		b:2,
	// 		c:3,
	// 		fn(){
	//
	// 		}
	// 	}
	// 	const obj2 = {
	// 		a:10,
	// 		b:20,
	// 		c:30,
	// 		fn(){
	//
	// 		}
	// 	}
	// }
	
	
	// * 方式三: 工厂模式
	// - 套路: 通过工厂函数动态创建对象并返回
	// - 适用场景: 需要创建多个对象
	// - 问题: 对象没有一个具体的类型, 都是Object类型(对象的constructor指向的都是Object函数)
	// {
	// 	function creator(type,payload){
	// 		return {
	// 			type,
	// 			payload
	// 		}
	// 	}
	// 	const obj = creator(1,"zhangsan");
	// 	const obj2 = creator(2,"lisi");
	// 	console.log(obj.constructor === obj2.constructor);
	// 	console.log(obj.constructor === Object);
	// 	console.log(obj.constructor === Object.prototype.constructor)
	// 	console.log(obj.__proto__ === Object.prototype)
	// 	console.log(obj.__proto__.constructor === Object.prototype.constructor)
	// 	console.log(obj.constructor === Object)
	// }
	
	// * 方式四: 自定义构造函数模式
	// * 套路: 自定义构造函数, 通过new创建对象
	// * 适用场景: 需要创建多个类型确定的对象
	// * 问题: 每个对象都有相同的数据, 浪费内存
	// {
	// 	function Box(userName,age){
	// 		this.userName = userName;
	// 		this.age = age;
	// 	}
	// 	const obj = new Box("zhangsan",12);
	// 	const obj2 = new Box("zhangsan",12);
	// 	// console.log(obj.constructor === Box);// true
	// 	// console.log(obj === obj2);// false
	// 	// obj.userName = "lisi";
	// 	// console.log(obj2.userName);// zhangsan
	// }
	
	
	// * 方式五: 构造函数+原型的组合模式
	// * 套路: 自定义构造函数, 属性在函数中初始化, 方法添加到原型上
	// * 适用场景: 需要创建多个类型确定的对象
	// {
	// 	function Box(){
	//
	// 	}
	// 	Box.prototype.fn = function(){
	//
	// 	}
	// 	const obj = new Box();
	// 	const obj2 = new Box();
	// 	// console.log(obj.__proto__ === obj2.__proto__);
	// 	obj.fn = function(){
	//
	// 	}
	// 	console.log(obj.fn === obj2.fn);
	// 	console.log(obj.__proto__.fn===obj2.fn)
	// }
</script>
</html>